#include "CalculateurReussite.hpp"

#include "XmlInfo/XmlInfoContrat.hpp"
#include "XmlInfo/XmlInfoMonstre.hpp"

#include "Core/BonusEquipement.hpp"

#include <QtCore/QDebug>

CalculateurReussite::CalculateurReussite()
{}

CalculateurReussite::~CalculateurReussite()
{}

unsigned CalculateurReussite::operator()( const XmlInfoContrat& contrat,
                                          const XmlInfoMonstre& monstre )
{
    if ( contrat . typeContrat() == Enfantin )
        return 100u;

    QHash< EnumCaracteristique, unsigned > tmp;

    return operator()( contrat, monstre, tmp );
}

unsigned CalculateurReussite::operator()( const XmlInfoContrat& contrat,
                                          const XmlInfoMonstre& monstre,
                                          QHash< EnumCaracteristique,
                                          unsigned >& Resultat )
{
    if ( contrat . typeContrat() == Enfantin )
    {
        QMutableHashIterator< EnumCaracteristique, unsigned > iterateur( Resultat );
        while( iterateur.hasNext() )
        {
            iterateur.next();
            iterateur.value() = 100u;
        }
        return 100u;
    }

    unsigned car, total( 1u );

    Resultat.clear();
    Resultat.reserve( 4 );

    for ( car = 0; car < 4; car++ )
    {
        if ( monstre . caracteristique( car ) == 0u &&
             contrat . caracteristique( car ) > 0u )
            Resultat[ static_cast< EnumCaracteristique >( car ) ] = 5u;
        else
            Resultat[ static_cast< EnumCaracteristique >( car ) ] =
                    std::min( 100u + 5u * ( monstre . caracteristique( car ) -
                                       contrat . caracteristique( car ) ) -
                         contrat . difficulte(), 100u );
    }

    if ( contrat . caracteristique( CarGourmandise ) == 0u )
    {
        unsigned coefficient( contrat . typeContrat() + 1u ) ;

        Resultat[ CarGourmandise ] = 100u + 5u * monstre . controle() -
                ( monstre . gourmandise() * coefficient ) / 2u;
    }

    QHashIterator< EnumCaracteristique, unsigned > iterateur( Resultat );
    while ( iterateur.hasNext() )
    {
        iterateur.next();
        total *= iterateur.value();
    }

    return total / 1000000u;
}
